/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.treinamento.collections.map.hashMap;

import com.treinamento.Auditoria;
import com.treinamento.collections.set.HashSet.Item;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Random;
import java.util.Set;

/**
 *
 * @author felipe
 */
public class NotaFiscal extends Auditoria {

    
    private String situacaoNota;
    private double valorImposto;
    private double valorTotal;
    private Set<Item> itensNota;
    private Map<String, Double> impostosNota;

    /*
     *  método responsável por instanciar o objeto NotaFiscal
     *  
     */
    public NotaFiscal() {
        itensNota = new HashSet<Item>();
        impostosNota = new HashMap<String, Double>();
    }

    /*
     *  método responsável por iniciar a nota fiscal
     *  retornando um suposto número de nota e 
     *  colocando a situacao da nota como aberta
     */
    public int abrirNota() {
        Random random = new Random();
        situacaoNota = "A";
        return random.nextInt();
    }

    /*
     *  método responsável por encerrar a nota
     *  apurando o imposto e alterando o status para fechada
     */
    public void fecharNota() {
        apurarImposto();
        situacaoNota = "F";
    }

    /*
     *  método responsável por apurar o imposto da nota
     *  o imposto da nota é apurado em cima do valor total de todos 
     *  os itens, que é multiplicado por um fator determinado no mapa de impostos
     */
    private void apurarImposto() {
        
        Set<String> impostos = impostosNota.keySet();
        
        for(String nome : impostos){
            
            Double percentualImposto = impostosNota.get(nome);
            
            for (Item item : itensNota) {
                valorImposto += item.getValor() * percentualImposto / 100;
            }
            
        }
    }

    /*
     *  método responsável por adicionar novos itens a nota
     *  somente se ela estiver aberta, os itens serão adicionados
     *  em uma tabela hash que não permitirá duplicidades
     */
    public void adicionarItens(Item item) {
        if (situacaoNota.equals("A")) {
            itensNota.add(item);
            valorTotal += item.getValor();
        }
        
    }
    
    /* método para configurar o mapa de impostos da nota */
    public void configurarImpostos(String nome, Double percentual){
        impostosNota.put(nome,percentual);
    }

    public int quantidadeItens(){
        return itensNota.size();
    }
    
    public String getSituacaoNota() {
        return situacaoNota;
    }

    public void setSituacaoNota(String situacaoNota) {
        this.situacaoNota = situacaoNota;
    }

    public Set<Item> getItensNota() {
        return itensNota;
    }

    public void setItensNota(Set<Item> itensNota) {
        this.itensNota = itensNota;
    }

    public double getValorImposto() {
        return valorImposto;
    }

    public void setValorImposto(double valorImposto) {
        this.valorImposto = valorImposto;
    }

    public double getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(double valorTotal) {
        this.valorTotal = valorTotal;
    }

    public Map<String, Double> getImpostosNota() {
        return impostosNota;
    }

    public void setImpostosNota(Map<String, Double> impostosNota) {
        this.impostosNota = impostosNota;
    }
    
    
}
